import { login, getUserInfoApi, getStaffInfoApi } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'

const state = {
  token: getToken() || '',
  userInfo: {}

}
const mutations = {
  setToken(state, newToken) {
    state.token = newToken
      setToken(newToken)
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
    // state.userInfo = { ...userInfo } // 用 浅拷贝的方式去赋值对象 因为这样数据更新之后，才会触发组件的更新
  },
  // 删除用户信息
  reomveUserInfo(state) {
    state.userInfo = {}
  },
  // 清除token
  removeTokenMut(state) {
    state.token = ''
    removeToken()// 清除cookie 里面的token
  }
}
const actions = {
  // 获取token
 async getToken({ commit }, obj) {
    const { data } = await login(obj)
    commit('setToken', data)
    return data
  },
  // 通过接口获取token
  //  getToken(context, data) {
  //   // const res = await login(data)
  //   // context.commit('setToken', res.data.data)
  //   // 创建一个新的 promise  对象 来解决异步回调问题
  //   return new Promise((resolve, reject) => {
  //     login(data)// 这里的.then.catch返回的是 login 请求成功或者失败 里面的resolve 成功  reject失败 返回到
  //       .then((res) => {
  //         resolve()
  //         context.commit('setToken', res.data)
  //       }).catch((err) => {
  //         reject()
  //         console.log(err)
  //       })
  //   })
  // },
// 获取用户资料action
 async getUserInfo({ commit }) {
    // 获取返回值
   const { data: data1 } = await getUserInfoApi()
   // 根据ID获取员工信息
   const { data: data2 } = await getStaffInfoApi(data1.userId)
  // 合并一下 请求返回的数据
   const obj = {
     ...data1, ...data2
   }
   commit('setUserInfo', obj)
   return obj// 返回一个data
   // 在 async 函数 返回一个return 结果等价于 promise 对象的 resolve
  // 因为asycn 函数的执行结果默认是 一个promise对象
   // 如果需要捕获错误 也就是promise 对象 reject 是再响应拦截器里面做了 判断

       // 封装一个promise 对象  并用return 返回 一个promise 对象  成功或者失败
    // 获取用户数据通过 .then .catch 捕获 成功或者 失败 并且 把promise的对象设置成功或者失败
    // 用户在登陆时 通过配合 async await 来等待 返回的 promise 对象 防止 出现 进入页面用户信息空白的问题
    // return new Promise((resolve, reject) => {
    //   getUserInfoApi()
    //     .then((res) => {
    //       const { data } = res
    //       commit('setUserInfo', data)
    //       resolve(res)
    //     })
    //     .catch((err) => {
    //       console.log(err)
    //       reject(err)
    //     })
    // })

    // console.log(res)
  },
 // 退出登录
 async logout({ commit }) {
   await commit('removeTokenMut')
   await commit('reomveUserInfo')

  // 3. 重置路由
  resetRouter()
  // 4. 重置 vuex 中的路由信息 root:true 跨模块调用方法
   await commit('permisson/setRoutes', [], { root: true })
   // 清楚主题颜色
   await commit('settings/resetTheme', [], { root: true })
 }
 // 退出的action操作

}
const getters = {}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}
